// 版权所有2021 Go作者。版权所有。
// 此源代码的使用受BSD样式的约束
// 可以在许可证文件中找到的许可证。

// go:构建typeparams
// +构建类型参数

package ast

import "go/token"

type (
	// FuncType节点表示函数类型。
	FuncType struct {
		Func    token.Pos  // “func”关键字的位置（如果没有“func”，则为token.NoPos）
		TParams *FieldList // 类型参数；还是零
		Params  *FieldList // （b）参数；非零
		Results *FieldList // （b）结果；还是零
	}

	// TypeSpec节点表示类型声明（TypeSpec产品）。
	TypeSpec struct {
		Doc     *CommentGroup // 相关文件；还是零
		Name    *Ident        // 类型名
		TParams *FieldList    // 类型参数；还是零
		Assign  token.Pos     // “=”的位置（如果有）
		Type    Expr          // *Ident、*ParenExpr、*SelectorExpr、*StarExpr或任意*xxx类型
		Comment *CommentGroup // 行注释；还是零
	}

	// ListXPR节点表示由逗号分隔的表达式列表。
	// ListXPR节点用作表示类型的IndexExpr节点中的索引
	// 或具有多个类型参数的函数实例化。
	ListExpr struct {
		ElemList []Expr
	}
)

func (*ListExpr) exprNode() {}
func (x *ListExpr) Pos() token.Pos {
	if len(x.ElemList) > 0 {
		return x.ElemList[0].Pos()
	}
	return token.NoPos
}
func (x *ListExpr) End() token.Pos {
	if len(x.ElemList) > 0 {
		return x.ElemList[len(x.ElemList)-1].End()
	}
	return token.NoPos
}
